#ifndef Link_hpp
#define Link_hpp

#include <stdio.h>
#include "LinkCommon.h"
#include "LinkCommand.h"

namespace HHLink {
/**
 *（所有接口的前置接口，需第一个调用）
 * link初始化
 */
    void init();
    void release();

/**
 *（必调接口，在init后调用）
 * 设置待发送指令的回调函数，APP在此回调中调用平台ble接口写入数据
 * @param fn 回调函数
 */
    void setWriteDataFn(LinkWriteDataFn fn);

/**
 *（必调接口，在init后调用）
 * 将APP收到了蓝牙指令数据传给link
 * @param data 数据
 * @param length 数据长度
 */
    void readData(const void *data, int length);

/**
 *（必调接口，在init后调用）
 * 设置link解析完指令后结果的回调
 * @param fn 回调函数 cmdCode:回调指令标识，见enum LinkCmdCode，errCode:错误码，0:成功，1:超时
 */
    void setReadDataResultFn(LinkReadDataResultFn fn);

/**
 *（必调接口，在init后调用）
 * 连接成功时调用此接口通知link
 * @param cname ble名称
 * @param cmac 设备mac地址
 */
    void connect(const char *cname, const char *cmac);

/**
 *（必调接口，在init后调用）
 * 断开连接时调用此接口
 */
    void disconnect();

/**
 *（必调接口，在init后调用）
 * 设置手机屏幕方向，当手机屏幕方向发生了变化时，调用此接口
 * @param orientation
 */
    void setOrientation(HHLinkOrientation orientation);

/**
 *（必调接口，在init后调用）
 * 设置当前是否是前置摄像头，手机摄像头前后置改变时，调用此接口通知link
 * @param isCameraFront 前置：true；后置：false
 */
    void setIsCameraFront(bool isCameraFront);

/**
 * 设置云台按键事件监听回调，APP可在此回调中监听来自云台设备的按键事件
 * @param fn 事件回调函数，事件类型见 @HHLinkEvent
 */
    void setEventFn(LinkGimbalEventFn fn);

/**
 * 验证设备信息，在连接成功后，会自动验证设备信息，如果需要手动验证设备信息，可调此接口
 * @param fn 结果回调
 */
    void verifyDeviceInfo(LinkVerifyResultFn fn);

/**
 * 将要发送指令buffer写入发送队列中，调用此接口后，可能不会立即发送（此接口一般需要自定义功能时才会调用）
 * @param buffer buffer数据结构体
 * @return 发送结果
 */
    bool writeBuffer(LinkBuffer buffer);

/**
 * 清除发送队列中待发送的指令
 */
    void clear();

/**
 * 获取云台的运行状态
 * 包括：电量信息
 */
    void getGimbalRunningStatus();

/**
 * 设置云台工作模式
 * 当mode=DIY时，为自定义工作模式，此时customMode才会生效，如果customMode=UNKOWN时，为全锁定模式；
 * 当mode设置为非DIY模式时，customMode设置不会生效
 * @param mode 云台工作模式
 * @param customMode 云台自定义工作模式
 */
    void setGimbalWorkMode(LINK_GIMBAL_WORK_MODE mode, LINK_GIMBAL_WORK_MODE_CUSTOM customMode);

/**
 * 设置云台跟随速度&稳拍风格
 * @param speed (0:柔顺&慢速，1：常规&中速，2：运动&快速，3：极速)
 */
    void setGimbalFollowSpeed(int speed);

/**
 * 设置云台电机力度，不支持自定义电机力度设置
 * @param force 见@LINK_GIMBAL_MOTOR_FORCE
 */
    void setGimbalMotorForce(LINK_GIMBAL_MOTOR_FORCE force);

/**
 * 设置云台自定义电机力度值-航向轴
 * @param value 力度值范围[1,4]
 */
    void setGimbalCustomMotorForcePan(int value);

/**
 * 设置云台自定义电机力度值-俯仰轴
 * @param value 力度值范围[1,4]
 */
    void setGimbalCustomMotorForceTilt(int value);

/**
 * 设置云台自定义电机力度值-横滚轴
 * @param value 力度值范围[1,4]
 */
    void setGimbalCustomMotorForceRoll(int value);

/**
 * 设置云台自定义电机力度-自适应
 */
    void setGimbalCustomMotorForceSelfAdaptive();

/**
 * 设置A/B点移动时长
 * @param sec 单位分钟
 */
    void setABMoveDuration(int sec);

/**
 * 设置摇杆左右控制反向
 * @param reverse 0:关&正向 1:开&反向
 */
    void setRockerPanReverse(int reverse);

/**
 * 设置摇杆左右速度
 * @param speed 范围[2,9]
 */
    void setRockerPanSpeed(int speed);

/**
 * 设置摇杆上下控制反向
 * @param reverse 0:关&正向 1:开&反向
 */
    void setRockerTiltReverse(int reverse);

/**
 * 设置摇杆上下速度
 * @param speed 范围[1,7]
 */
    void setRockerTiltSpeed(int speed);

/**
 * 设置横滚轴微调值
 * @param offset 范围[-3.0,3.0]
 */
    void setGimbalRollOffset(float offset);

/**
 * 设置航向轴微调
 * @param offset 范围[-3.0,3.0]
 */
    void setGimbalPanOffset(float offset);

/**
 * 设置俯仰轴微调
 * @param offset 范围[-3.0,3.0]
 */
    void setGimbalTiltOffset(float offset);

/**
 * 设置云台静音模式
 * @param mode 0:静音 1:非静音
 */
    void setGimbalToneMode(int mode);

/**
 * 设置盗梦空间速度
 * @param speed 范围[1,100]
 */
    void setGimbalInceptionSpeed(int speed);

/**
 * 校准云台
 * @param callback 校准结果回调
 */
    void setGimbalCalibrate(LinkCalibrateResultFn callback);

/**
 * 恢复出厂设置
 * @param callback 结果回调
 * code:
 * -1:busy，表示已经调用了接口，正在执行
 * 0:success,执行成功
 * 1:摇杆恢复失败
 * 2:电机力度恢复失败
 * 3:工作模式恢复失败
 * 4:跟随速度恢复失败
 * 5:加速度计微调恢复失败
 * 6:编码器微调恢复失败
 * 7:盗梦空间速度恢复失败
 * 8:稳定器提示音恢复失败
 * 9:稳定器偏好设置恢复失败
 */
    void setGimbalFactoryReset(LinkResetFactoryResultFn callback);

/**
 * 恢复AI出厂设置
 * @param callback code -1：超时， 0：成功，1：busy
 */
    void setGimbalFactoryResetAI(LinkResetFactoryResultFn callback);

/**
 * 远程摇杆控制
 * @param x 触点x轴的相对坐标，范围[-1,1]
 * @param y 触点y轴的相对坐标，范围[-1,1]
 */
    void setRemoteRockerControl(float x, float y);

/**
 * 设置云台开机横竖屏方向
 * @param dir 0：正常开机（AI 朝下） 1：顺时针 90 度开机（AI 朝左） 2：顺时针 180 度开机（AI 朝上） 3：顺时针 270 度开机（AI 朝右） 4：不设置开机角度
 */
    void setGimbalBootScreenDirection(int dir);

}






#endif /* Link_hpp */
